﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Resources;
using AnalizadorCsv.Clases;
using System.Windows.Forms;

namespace AnalizadorCsv.Analizador
{
    public class Proceso
    {
        private List<String> seleccion;
        private List<String> archivosCompletos;
        private List<String> rutas;
        private Detalles detalles;
        private int cantErrores;
        public void asignarDetalle(Detalles detalles)
        {
            this.detalles = detalles;

        }
        public void iniciarProceso()
        {
           
//            this.detalles.Show();
            Thread p1 = new Thread(new ThreadStart(procesoActual));
            p1.Start();
            this.detalles.ShowDialog();
        }
        public void procesoActual()
        {
            this.cantErrores = 0;
            String archivoActual="";
            float cuota = 100f / seleccion.Count;
             for (int i = 0; i < seleccion.Count; i++)
                        {
                            archivoActual = seleccion[i];
                            this.detalles.actualizarValores(archivoActual, "Analizando Archivo...", (int)cuota * i);
                            /*
                             * Proceso Normal
                             */
                            generarPaso(archivoActual, this.rutas[i]);
                        }
             this.detalles.actualizarValores("","",100);
             MessageBox.Show("Proceso finalizado\n" + cantErrores.ToString() + " errores encontrados", "Fin del Proceso", MessageBoxButtons.OK, cantErrores == 0 ? MessageBoxIcon.Information : MessageBoxIcon.Error); 
        }
        private void generarPaso(String seleccionado, String archivo)
        {
            ComponenteAnalizador analizador=null;
            String arch = seleccionado;
            arch = arch.Replace('.', '_');
            String valor = Files.ResourceManager.GetString(arch);
            Console.WriteLine(arch+" "+valor);
            Fuente fuente = (Fuente)Enum.Parse(typeof(Fuente), valor);
            switch (fuente)
            {
                case Fuente.CONNECTION:
                    Connection con = new Connection(archivo, this.detalles, this.cantErrores);
                   analizador = con;
                    break;
                case Fuente.CONTACT:
                    Contact cont = new Contact(archivo, this.detalles, this.cantErrores);
                   analizador = cont;
                    break;
                case Fuente.CONTACT_ORGANIZATION:
                    ContactOrganization conto = new ContactOrganization(archivo, this.detalles, this.cantErrores);
                   analizador = conto;
                    break;
                case Fuente.LOCATION:
                    Location loc = new Location(archivo, this.detalles, this.cantErrores);
                    analizador = loc;
                    break;
                case Fuente.LOCATION_ORG:
                    LocationOrg loco = new LocationOrg(archivo, this.detalles, this.cantErrores);
                   analizador = loco;
                    break;
                case Fuente.NONE: break;
                case Fuente.OCCURRENCE:
                    Occurrence ocu = new Occurrence(archivo, this.detalles, this.cantErrores);
                   analizador = ocu;
                    break;
                case Fuente.OPPORTUNITY_OCCURRENCE:
                    OpportunityOccurrence opc = new OpportunityOccurrence(archivo, this.detalles, this.cantErrores);
                    //analizador = opc;
                    break;
                case Fuente.ORGANIZATION:
                    Organization org = new Organization(archivo, this.detalles, this.cantErrores);
                    analizador = org;
                    break;
                case Fuente.VOLUNTEER_EVENT:
                    VolunteerEvent voe = new VolunteerEvent(archivo, this.detalles, this.cantErrores);
                    //analizador = voe;
                    break;
                case Fuente.VOLUNTEER_OPPORTUNITY:
                    VolunteerOpportunity voo = new VolunteerOpportunity(archivo, this.detalles, this.cantErrores);
                    //analizador = voo;
                    break;
                case Fuente.VOLUNTEER_TEAM:
                    VolunteerTeam vt = new VolunteerTeam(archivo, this.detalles, this.cantErrores);
                    //analizador = vt;
                    break;
                case Fuente.VOLUNTEER_TEAM_MEMBER:
                    VolunteerTeamMember vtm = new VolunteerTeamMember(archivo, this.detalles, this.cantErrores);
                    //analizador = vtm;
                    break;
                case Fuente.ZIPCODE:
                    zipCode aux = new zipCode(archivo,this.detalles,this.cantErrores);
                    analizador = aux;
                    break;
                   
            }
            if (analizador != null)
            {
                analizador.ejecutarAnalisis();
                this.cantErrores = analizador.totalErrores();
            }


        }
        public Proceso(List<String> seleccion, List<String> archivosCompletos)
        {
            this.seleccion = seleccion;
            this.archivosCompletos = archivosCompletos;
            this.rutas = new List<String>(this.seleccion.Count);
            for (int i = 0; i < this.seleccion.Count; i++)
            {
                this.rutas.Add("");
            }
            foreach (String s in archivosCompletos)
            {
                FileInfo fi = new FileInfo(s);
                if (verificar(fi.Name))
                {
                    int pos = obtenerPosicion(fi.Name);
                   
                    if (pos != -1)
                        this.rutas[pos] = s;
                }
            }
        }
        private int obtenerPosicion(String ar)
        {
            return this.seleccion.IndexOf(ar);
        }
        private bool verificar(String ar)
        {
            foreach (String s in this.seleccion)
            {
                if (s == ar)
                    return true;
            }
            return false;
        }
    }
}
